home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1998 January / Macworld (1998-01).dmg / Shareware World / Comms & Internet / HTML mode 2.0 etc. / htmlStatusBar.tcl < prev    next >
Text File  |  1997-09-22  |  18KB  |  672 lines

  1. ## -*-Tcl-*-
  2.  # ###################################################################
  3.  #  HTML mode - tools for editing HTML documents
  4.  # 
  5.  #  FILE: "htmlStatusBar.tcl"
  6.  #                                    created: 96-06-16 14.24.31 
  7.  #                                last update: 97-09-20 19.07.02 
  8.  #  Author: Johan Linde
  9.  #  E-mail: <jl@theophys.kth.se>
  10.  #     www: <http://bach.theophys.kth.se/~jl/Alpha.html>
  11.  #  
  12.  # Version: 2.0
  13.  # 
  14.  # Copyright 1996, 1997 by Johan Linde
  15.  #  
  16.  # This software may be used freely, and distributed freely, as long as the 
  17.  # receiver is not obligated in any way by receiving it.
  18.  #  
  19.  # If you make improvements to this file, please share them!
  20.  # 
  21.  # ###################################################################
  22.  ##
  23.  
  24. proc htmlStatusBar.tcl {} {}
  25.  
  26. # Opening or only tag of an element - include attributes
  27. # Status bar for each attribute.
  28. # Return empty string if user skips an attribute which must be used.
  29. proc htmlOpenElemStatusBar {elem used wrPos {values ""} {addNotUsed 0} {addHidden 0} {absPos ""}} {
  30.     global htmlActiveElem htmlActiveUsed htmlActiveAttr htmlActiveCache
  31.     global HTMLmodeVars htmlPackageToUse htmlElemEventHandler1
  32.     global htmlURLAttr htmlColorAttr htmlWindowAttr htmlWrapPos
  33.     global htmlSpecURL htmlSpecColor htmlSpecWindow  htmlActiveWidth htmlActiveHeight
  34.     
  35.     set promptNoisily $HTMLmodeVars(promptNoisily)
  36.     
  37.     if {![string length $used]} {set used $elem}
  38.     set elem [string toupper $elem]
  39.     set used [string toupper $used]
  40.     
  41.     set htmlActiveUsed $used
  42.     set htmlActiveElem $elem
  43.     set text "<"
  44.     append text [htmlSetCase $elem]
  45.  
  46.     # if there are attributes to ask about, do so
  47.     set reqatts [htmlGetRequired $used]
  48.     set askformore [htmlGetAttrMore $used]
  49.     set optatts [htmlGetOptional $used]
  50.     set useatts [htmlGetUsed $used $reqatts $optatts]
  51.     set alloptatts [htmlGetOptional $used 1]
  52.     set NumberAttrs [htmlGetNumber $used]
  53.     
  54.     set eventatts ""
  55.     set hiddenAtts ""
  56.     set notUsedAtts ""
  57.     set allatts $useatts
  58.     # Add the rest of the attributes?
  59.     if {$askformore || $addNotUsed} {
  60.         foreach attr $optatts {
  61.             if {[lsearch -exact $useatts $attr] < 0} { lappend notUsedAtts $attr}
  62.         }
  63.     }
  64.     set hasAddedHidden 0
  65.     if {$askformore || $addHidden} {
  66.         foreach a $alloptatts {
  67.             if {[lsearch -exact [concat $allatts $notUsedAtts] $a] < 0} {
  68.                 lappend hiddenAtts $a
  69.             }
  70.         }
  71.     }
  72.     if {$addNotUsed} {
  73.         append allatts " " $notUsedAtts
  74.         append useatts " " $notUsedAtts
  75.         set notUsedAtts ""
  76.     }
  77.     if {$addHidden} {
  78.         append allatts " $hiddenAtts"
  79.         append useatts " $hiddenAtts"
  80.         set hasAddedHidden 1
  81.     }
  82.     # optionally include event handlers
  83.     if {$HTMLmodeVars(inclEventHandler)} {
  84.         set eventatts [htmlGetEvent $used]
  85.         append useatts " " $eventatts
  86.         append allatts " " $eventatts
  87.     }
  88.     append allatts " " $notUsedAtts
  89.     if {$askformore && $notUsedAtts == "" && !$hasAddedHidden} {
  90.         append allatts " " $hiddenAtts
  91.         set hasAddedHidden 1
  92.     }
  93.     set htmlActiveWidth ""
  94.     set htmlActiveHeight ""
  95.     
  96.     # wrapping
  97.     if {$absPos == ""} {set absPos [getPos]}
  98.     set htmlWrapPos [expr $wrPos == -1 ? [lindex [posToRowCol [getPos]] 1] : $wrPos]
  99.     incr htmlWrapPos [expr [string length $text] + 1]
  100.     for {set i 0} {$i < [llength $allatts] && [llength $useatts]} {incr i} {
  101.     
  102.         set attr [lindex $allatts $i]
  103.         if {$i == [llength $useatts]} { 
  104.             # it's time to ask if more is wanted
  105.             if {$promptNoisily} {beep}
  106.             set more ""
  107.             if {$used == "LI IN UL" || $used == "LI IN OL"} {
  108.                 set pr "LI:"
  109.             } else {
  110.                 set pr "${used}:"
  111.             }
  112.             while {[catch {statusPrompt "$pr More attributes? \[no\] " htmlStatusAskYesOrNo} more]} {
  113.                 if {$more == "Cancel all!"} {
  114.                     message "Cancel"
  115.                     error ""
  116.                 }
  117.             }
  118.             if {$more != "yes"} { break }
  119.             set useatts $allatts
  120.             if {!$hasAddedHidden} {
  121.                 append allatts " $hiddenAtts"
  122.                 set hasAddedHidden 1
  123.             }
  124.         }
  125.         if {[lsearch -exact $reqatts $attr] >= 0} {
  126.             set required 1
  127.         } else {
  128.             set required 0
  129.         }
  130.         set htmlActiveAttr $attr
  131.         set a2 [string trimright $attr =]
  132.         if {[string index $attr [expr [string length $attr] - 1]] == "="} {
  133.             if {([lsearch -exact $htmlURLAttr $attr] >= 0 && [lsearch -exact $htmlSpecURL "${used}!=$a2"] < 0) || \
  134.             [lsearch -exact $htmlSpecURL "${used}=$a2"] >= 0} { 
  135.                 # URL attibute
  136.                 set htmlActiveCache URLs
  137.                 if {[catch {htmlAskURL $attr $required [lindex $values $i]} v]} {
  138.                     if {$v != "Skip rest!"} {
  139.                         error ""
  140.                     } elseif {!$required} {
  141.                         set i [llength $allatts]
  142.                     } else {
  143.                         set v ""
  144.                     }
  145.                 } elseif {[string length $v]} {
  146.                     append text [htmlWrapTag "[htmlSetCase $attr][htmlAddQuotes [htmlURLescape2 $v]]"]
  147.                 }
  148.             } elseif {([lsearch -exact $htmlColorAttr $attr] >= 0 && [lsearch -exact $htmlSpecColor "${used}!=$a2"] < 0) || \
  149.             [lsearch -exact $htmlSpecColor "${used}=$a2"] >= 0} { 
  150.                 # Color attribute
  151.                 if {[catch {htmlAskColor $attr $required [lindex $values $i]} v]} {
  152.                     if {$v != "Skip rest!"} {
  153.                         error ""
  154.                     } elseif {!$required} {
  155.                         set i [llength $allatts]
  156.                     } else {
  157.                         set v ""
  158.                     }
  159.                 } elseif {[string length $v]} {
  160.                     append text [htmlWrapTag "[htmlSetCase $attr][htmlAddQuotes $v]"]
  161.                 }
  162.             } elseif {([lsearch -exact $htmlWindowAttr $attr] >= 0 && [lsearch -exact $htmlSpecWindow "${used}!=$a2"] < 0) || \
  163.             [lsearch -exact $htmlSpecWindow "${used}=$a2"] >= 0} { 
  164.                 # Window attribute
  165.                 set htmlActiveCache windows
  166.                 if {[catch {htmlAskURL $attr $required [lindex $values $i]} v]} {
  167.                     if {$v != "Skip rest!"} {
  168.                         error ""
  169.                     } elseif {!$required} {
  170.                         set i [llength $allatts]
  171.                     } else {
  172.                         set v ""
  173.                     }
  174.                 } elseif {[string length $v]} {
  175.                     append text [htmlWrapTag "[htmlSetCase $attr][htmlAddQuotes $v]"]
  176.                 }
  177.             } elseif {[lsearch $NumberAttrs "$attr*"] >= 0} { 
  178.                 # Number attribute
  179.                 if {[catch {htmlAskNumber $used $attr $required [lindex $values $i]} v]} {
  180.                     if {$v != "Skip rest!"} {
  181.                         error ""
  182.                     } elseif {!$required} {
  183.                         set i [llength $allatts]
  184.                     } else {
  185.                         set v ""
  186.                     }
  187.                 } elseif {[string length $v]} {
  188.                     append text [htmlWrapTag "[htmlSetCase $attr][htmlAddQuotes $v]"]
  189.                 }
  190.             } else { 
  191.                 # other attribute
  192.                 if {$promptNoisily} {beep}
  193.                 if {[catch {htmlStatusAskAttr $used $attr $required [lindex $values $i]} v]} {
  194.                     if {$v != "Skip rest!"} {
  195.                         error ""
  196.                     } elseif {!$required} {
  197.                         set i [llength $allatts]
  198.                     } else {
  199.                         set v ""
  200.                     }
  201.                 } elseif {[string length $v]} {
  202.                     htmlOpenExtraThings $used $attr $v
  203.                     if {[lsearch -exact $eventatts $attr] < 0} {
  204.                         set attr [htmlSetCase $attr]
  205.                     }
  206.                     append text [htmlWrapTag "$attr[htmlAddQuotes $v]"]
  207.                 }
  208.             }
  209.             if {![string length $v] && $required } {
  210.                 alertnote "You must give $attr a value."
  211.                 incr i -1
  212.             } 
  213.         } else { 
  214.             # yes-no attribute
  215.             if {$promptNoisily} {beep}
  216.             set v ""
  217.             set yn no
  218.             if {[lindex $values $i] == "1"} {set yn yes}
  219.             while {[catch {statusPrompt "${used}:$attr \[$yn\] " htmlStatusAskYesOrNo} v]} {
  220.                 if {$v == "Cancel all!"} {
  221.                     message "Cancel"
  222.                     error ""
  223.                 }
  224.                 if {$v == "Skip rest!"} {
  225.                     set i [llength $allatts]
  226.                     break
  227.                 }
  228.                 if {$v == "No value"} {
  229.                     set v no
  230.                     break
  231.                 }
  232.             }
  233.             if {$v == ""} {set v $yn}
  234.             if {$v == "yes"} {append text [htmlWrapTag [htmlSetCase $attr]]}
  235.         }
  236.     }
  237.  
  238.     # Some tests that input is ok.
  239.     if {[htmlFontBaseTest $text "message"]} {beep; set text ""}
  240.     if {$elem == "A" && [htmlATest $text "message"]} {beep; set text ""}
  241.     if {$elem == "FRAMESET" && [htmlFramesetTest $text "message"]} {beep; set text ""}
  242.     if {$elem == "SPACER" && [htmlSpacerTest $text "message"]} {beep; set text ""}
  243.     if {$elem == "AREA" && [htmlAreaTest $text "message"]} {beep; set text ""}
  244.     if {[string length $text] } {append text ">"}
  245.     catch {unset htmlActiveUsed}
  246.     catch {unset htmlActiveElem}
  247.     catch {unset htmlActiveAttr}
  248.     catch {unset htmlActiveCache}
  249.     catch {unset htmlActiveWidth}
  250.     catch {unset htmlActiveHeight}
  251.     return ${text}
  252. }
  253.  
  254. # Choose a color name or add a color number
  255.  
  256. proc htmlAskColor {attr required default} {
  257.     global  HTMLmodeVars htmlColorTabSeen htmlActiveUsed htmlColorName
  258.     global  basicColors htmluserColors htmlColors htmlActiveColor
  259.     
  260.     set promptNoisily    $HTMLmodeVars(promptNoisily)
  261.     
  262. # put users colours first
  263.     set htmlColors [lsort [array names htmluserColors]]
  264.      append htmlColors " " $basicColors
  265.      
  266.      while {1} {
  267.          # Loop until input is valid or everything is cancelled, then something is returned
  268.          if {$promptNoisily} {beep}
  269.          set htmlColorTabSeen 0
  270.          set pr ""
  271.          if {!$required} { set pr "(optional) "}
  272.          append pr ${htmlActiveUsed}:${attr}
  273.          if {$default != ""} {append pr " \[$default\] "}
  274.          while {[catch {statusPrompt $pr htmlColorStatusFunc} r]} {
  275.              if {$r == "Cancel all!"} {
  276.                  message "Cancel"
  277.                  error ""
  278.              }
  279.              if {$r == "Continue!"} {
  280.                  set r $htmlActiveColor
  281.                  unset htmlActiveColor
  282.                  break
  283.              }
  284.              if {$r == "Skip rest!"} {error "Skip rest!"}
  285.              if {$r == "No value"} {return}
  286.          }
  287.          set r [string trim $r]
  288.          if {$r == ""} {return $default}
  289.          # Users own color?
  290.          if {[info exists htmluserColors($r)]} {return $htmluserColors($r)}
  291.          # Predefined color?
  292.          if {[info exists htmlColorName($r)]} {
  293.              return $htmlColorName($r)
  294.          } else {
  295.              set col [htmlCheckColorNumber $r]
  296.              if {$col != 0} {
  297.                  return $col
  298.              } else {
  299.                  alertnote "$r is not a valid color number. It should be of the form #RRGGBB."
  300.              }
  301.          }
  302.      }
  303. }
  304.  
  305. proc htmlColorStatusFunc {curr c} {
  306.     global  htmlActiveAttr htmlColorTabSeen htmlColorName
  307.     global htmlColors htmlActiveColor htmlActiveUsed
  308.     
  309.     if {$c == "\032"} {
  310.         error "Cancel all!"
  311.     }
  312.     if {$c == "\021"} {error "Skip rest!"}
  313.     if {$c == "\004"} {error "No value"}
  314.     # ctrl-f is new color.
  315.     if {$c == "\006"} {
  316.         set newcolor [htmlAddNewColor]
  317.         if {[string length $newcolor]} {
  318.             set htmlActiveColor $newcolor
  319.             error "Continue!"
  320.         } else {
  321.             return
  322.         }
  323.     }
  324.     
  325.     if {$c != "\t"} {
  326.         set htmlColorTabSeen 0
  327.         return $c
  328.     }
  329.  
  330.     set matches {}
  331.     set attr $htmlActiveAttr
  332.     foreach w $htmlColors {
  333.         if {[string match "$curr*" $w]} {
  334.             lappend matches $w
  335.         }
  336.     }
  337.     if {![llength $matches]} {
  338.         beep
  339.     } else {
  340.         if {$htmlColorTabSeen} {
  341.             if {[catch {listpick -p ${htmlActiveUsed}:${htmlActiveAttr} $matches} ret]} {
  342.                 set ret ""
  343.             }
  344.             if {[string length $ret]} {
  345.                 set htmlActiveColor $ret
  346.                 error "Continue!"
  347.             }
  348.             set htmlColorTabSeen 0
  349.         } else {
  350.             set htmlColorTabSeen 1
  351.             set ret [string range [largestPrefix $matches] [string length $curr] end]
  352.         }
  353.         return $ret
  354.     }
  355.     return
  356. }
  357.  
  358.  
  359. # HREF attributes are handled as a listpick from a cached list
  360. proc htmlAskURL {attr required default} {
  361.     global htmlURLTabSeen
  362.     global HTMLmodeVars htmlActiveUsed htmlActiveCache htmlActiveURL
  363.     
  364.     if {$HTMLmodeVars(promptNoisily)} {beep}
  365.     set htmlURLTabSeen 0
  366.     if {!$required} { set pr "(optional) "}
  367.     append pr ${htmlActiveUsed}:${attr}
  368.     if {$default != ""} {append pr " \[$default\] "}
  369.     while {[catch {statusPrompt $pr htmlURLStatusFunc} r]} {
  370.         if {$r == "Cancel all!"} {
  371.             message "Cancel"
  372.             error ""
  373.         }
  374.         if {$r == "Continue!"} {
  375.             set r $htmlActiveURL
  376.             unset htmlActiveURL
  377.             break
  378.         }
  379.         if {$r == "Skip rest!"} {error "Skip rest!"}
  380.         if {$r == "No value"} {return}
  381.     }
  382.     set r [string trim $r]
  383.     htmlAddToCache $htmlActiveCache $r
  384.     if {$r == ""} {return $default}
  385.     return $r
  386. }
  387.  
  388.  
  389. proc htmlURLStatusFunc {curr c} {
  390.     global HTMLmodeVars  htmlActiveAttr htmlURLTabSeen htmlActiveCache htmlActiveURL
  391.     global htmlActiveUsed htmlActiveWidth htmlActiveHeight
  392.     
  393.     if {$c == "\032"} {
  394.         error "Cancel all!"
  395.     }
  396.     if {$c == "\021"} {error "Skip rest!"}
  397.     if {$c == "\004"} {error "No value"}
  398.     if {$htmlActiveCache == "windows"} {set URLs {_self _top _parent _blank}}
  399.     append URLs " " $HTMLmodeVars($htmlActiveCache)
  400.     
  401.     # ctrl-f for file dialog.
  402.     if {$c == "\006"} {
  403.         if {$htmlActiveCache == "windows"} {
  404.             beep
  405.             return
  406.         }
  407.         set newURL [htmlGetFile]
  408.         if {[string length $newURL]} {
  409.             set htmlActiveURL [lindex $newURL 0]
  410.             if {[llength [set nnn [lindex $newURL 1]]] && $htmlActiveAttr == "SRC="} {
  411.                 set htmlActiveWidth [lindex $nnn 0]
  412.                 set htmlActiveHeight [lindex $nnn 1]
  413.             }
  414.             error "Continue!"
  415.         } else {
  416.             return
  417.         }
  418.     }
  419.  
  420.     if {$c != "\t"} {
  421.         set htmlURLTabSeen 0
  422.         return $c
  423.     }
  424.  
  425.     set matches {}
  426.     foreach w $URLs {
  427.         if {[string match "$curr*" $w]} {
  428.             lappend matches $w
  429.         }
  430.     }
  431.     if {![llength $matches]} {
  432.         beep
  433.     } else {
  434.         if {$htmlURLTabSeen} {
  435.             if {[catch {listpick -p ${htmlActiveUsed}:${htmlActiveAttr} $matches} ret]} {
  436.                 set ret ""
  437.             }
  438.             if {[string length $ret]} {
  439.                 set htmlActiveURL $ret
  440.                 error "Continue!"
  441.             }
  442.             set htmlURLTabSeen 0
  443.         } else {
  444.             set htmlURLTabSeen 1
  445.             set ret [string range [largestPrefix $matches] [string length $curr] end]
  446.         }
  447.         return $ret
  448.     }
  449.     return
  450. }
  451.  
  452. proc htmlStatusAskAttr {used attr required default} {
  453.     global htmlAttrTabSeen htmlActiveInput
  454.  
  455.     set htmlAttrTabSeen 0
  456.     if {!$required} {
  457.         set pr "(optional) "
  458.     } else {
  459.         set pr {}
  460.     }
  461.     if {$used == "LI IN UL" || $used == "LI IN OL"} { # these two are special
  462.          append pr LI:$attr
  463.     } else {
  464.         append pr ${used}:$attr
  465.     }
  466.     if {$default != ""} {append pr " \[$default\] "}
  467.     set v ""
  468.     while {[catch {statusPrompt $pr htmlAttrStatusFunc} v]} {
  469.         if {$v == "Cancel all!"} {
  470.             message "Cancel"
  471.             error ""
  472.         }
  473.         if {$v == "Continue!"} {
  474.             set v $htmlActiveInput
  475.             unset htmlActiveInput
  476.             break
  477.         }
  478.         if {$v == "Skip rest!"} {error "Skip rest!"}
  479.         if {$v == "No value"} {return}
  480.     }
  481.     
  482.     # Trim only if it's only spaces.
  483.     if {[string trim $v] == ""} {set v ""}
  484.     if {$v == ""} {return $default}
  485.      # if there are choices, check if the user has typed one.
  486.     set choices [htmlGetChoices $used]
  487.     
  488.     set matches {}
  489.     set areChoices [string match "*${attr}*" $choices]
  490.  
  491.     if {!$areChoices} {
  492.         return $v
  493.     } else {
  494.         foreach w $choices {
  495.             if {($used == "LI IN OL" || $used == "OL") && $attr == "TYPE="} { # special case
  496.                 set c ${attr}$v
  497.             } else {
  498.                 set c [string toupper "${attr}${v}*"]    
  499.             }
  500.             if {[string match "${c}*" $w]} {
  501.                 lappend matches  $w 
  502.             }
  503.         } 
  504.         # if unique extension, add what's needed, otherwise return nothing.
  505.         if {[llength $matches] == 1 && [string length $v]} {
  506.             set ret [string range $matches [string length $attr] end]
  507.             if {($used != "LI IN OL" && $used != "OL") || $attr != "TYPE="} {
  508.                 set ret [htmlSetCase $ret] 
  509.             }
  510.             return $ret
  511.         } else {
  512.             return
  513.         }
  514.     }
  515. }
  516.  
  517. # CDATA element attribute, status window match completion
  518. proc htmlAttrStatusFunc {curr c} {
  519.     global htmlActiveUsed htmlActiveAttr htmlAttrTabSeen htmlActiveInput
  520.  
  521.     if {$c == "\032"} {error "Cancel all!"}
  522.     if {$c == "\021"} {error "Skip rest!"}
  523.     if {$c == "\004"} {error "No value"}
  524.     # should we set the case or not (are there predefined choices)?
  525.     set choices [htmlGetChoices $htmlActiveUsed]
  526.     set matches {}
  527.     set attr $htmlActiveAttr
  528.     set areChoices [string match "*${attr}*" $choices]
  529.     foreach w $choices {
  530.         if {($htmlActiveUsed == "LI IN OL" ||  $htmlActiveUsed == "OL") \
  531.             && $attr == "TYPE="} {     # special case
  532.             if {[string match "${attr}${curr}*" $w]} {
  533.                 lappend matches [string range $w [string length $attr] end]
  534.             }
  535.         } elseif {[string match [string toupper "${attr}${curr}*"] $w]} {
  536.             lappend matches [string range $w [string length $attr] end]
  537.         }
  538.     }
  539.     
  540.     if {$c != "\t" } {
  541.         set htmlAttrTabSeen 0
  542.         if {$areChoices} {
  543.         # check if the last character matches
  544.             set matches {}
  545.             foreach w $choices {
  546.                 if {[string match [string toupper "${attr}${curr}${c}*"] $w]} {
  547.                     lappend matches [string range $w [string length $attr] end]
  548.                 }
  549.             }
  550.             if {[llength $matches]} { 
  551.                 if {($htmlActiveUsed != "LI IN OL" &&  $htmlActiveUsed != "OL") \
  552.                     || $attr != "TYPE="} { # special case 
  553.                     set c [htmlSetCase $c] 
  554.                 }
  555.                 return $c
  556.             } else {
  557.                 beep
  558.                 return
  559.             } 
  560.         } else {
  561.             return $c
  562.         }
  563.     }
  564.     
  565.     # it's a tab
  566.     if {![llength $matches]} {
  567.         beep
  568.     } else {
  569.         if {$htmlAttrTabSeen} {
  570.             if {[catch {listpick -p ${htmlActiveUsed}:${htmlActiveAttr} $matches} ret]} {
  571.                 set ret ""
  572.             }
  573.             if {[string length $ret]} {
  574.                 set htmlActiveInput $ret
  575.                 error "Continue!"
  576.             }
  577.             set htmlAttrTabSeen 0
  578.         } else {
  579.             set htmlAttrTabSeen 1
  580.             set ret [string range [largestPrefix $matches] [string length $curr] end]
  581.         }
  582.         if {($htmlActiveUsed != "LI IN OL" &&  $htmlActiveUsed != "OL") \
  583.         || $attr != "TYPE="} { 
  584.             # special case 
  585.             set ret [htmlSetCase $ret] 
  586.         }
  587.         return $ret
  588.     }
  589.     return
  590. }
  591.  
  592. # ask for an attribute which is a number. Returns "" if input is not valid.
  593. proc htmlAskNumber {item attr required default} {
  594.     global HTMLmodeVars  htmlActiveWidth htmlActiveHeight
  595.     
  596.     set promptNoisily    $HTMLmodeVars(promptNoisily)
  597.     
  598.     # loop until input is valid, then something is returned
  599.     while {1} { 
  600.         if {$promptNoisily} {beep}
  601.         set pr ""
  602.         if {!$required} { set pr "(optional) "}
  603.         # these two are special
  604.         if {$item == "LI IN UL" || $item == "LI IN OL"} { 
  605.             append pr LI:$attr
  606.         } else {
  607.             append pr ${item}:$attr
  608.         }
  609.         if {$item == "IMG" && $attr == "WIDTH=" && $htmlActiveWidth != ""} {
  610.             append pr " \[$htmlActiveWidth\] "
  611.         } elseif {$item == "IMG" && $attr == "HEIGHT=" && $htmlActiveHeight != ""} {
  612.             append pr " \[$htmlActiveHeight\] "
  613.         } elseif {$default != ""} {
  614.             append pr " \[$default\] "
  615.         }
  616.         
  617.         while {[catch {statusPrompt $pr htmlNumberStatusFunc} r]} { 
  618.             if {$r == "Cancel all!"} {
  619.                 message "Cancel"
  620.                 error ""
  621.             }
  622.             if {$r == "Skip rest!"} {error "Skip rest!"}
  623.             if {$r == "No value"} {return}
  624.         }
  625.         
  626.         set r [string trim $r]
  627.         # if no input, return default
  628.         if {$r == ""} {
  629.             if {$item == "IMG" && $attr == "WIDTH=" && $htmlActiveWidth != ""} {
  630.                 return $htmlActiveWidth
  631.             } elseif {$item == "IMG" && $attr == "HEIGHT=" && $htmlActiveHeight != ""} {
  632.                 return $htmlActiveHeight
  633.             } else {
  634.                 return $default
  635.             }
  636.         }
  637.         # check that input is valid.
  638.         set numcheck [htmlCheckAttrNumber $item $attr $r]
  639.         if {$numcheck == 1} {
  640.             return $r 
  641.         } else {
  642.             alertnote "Invalid input. $numcheck"
  643.         }
  644.     }
  645. }
  646.  
  647. proc htmlNumberStatusFunc {curr c} {
  648.  
  649.     if {$c == "\032"} {error "Cancel all!"}
  650.     if {$c == "\021"} {error "Skip rest!"}
  651.     if {$c == "\004"} {error "No value"}
  652.     if {[lsearch -exact {+ - 0 1 2 3 4 5 6 7 8 9 %} $c] >=0 } {
  653.         return $c
  654.     } else {
  655.         beep
  656.     }
  657. }
  658.  
  659. # Force yes or no in the status window
  660. proc htmlStatusAskYesOrNo {curr c} {
  661.     if {$c == "\032"} {error "Cancel all!"}
  662.     if {$c == "\021"} {error "Skip rest!"}
  663.     if {$c == "\004"} {error "No value"}
  664.     set c [string tolower $c]
  665.     if {$curr == ""} {
  666.         if {$c == "n"} {return "no"}
  667.         if {$c == "y"} {return "yes"}
  668.     }
  669.     beep
  670.     return
  671. }
  672.